<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>数组与函数</title>
		<style>
			div {
				background-color: red;
				background-clip: text;
				color: transparent;
			}
		</style>
	</head>
	<body>
	

		<div>sssssss</div>

		<script type="text/javascript">
			
			var a = {
				a:10,
				b:20,
				c:'hello',
				d:[1,2,3],
				e:null,
				f:undefined,
				g:NaN,
				h:function(){},
				i:0,
				j:''
			};
			
			var b = deepCopy(a)
			
			
			b.a = 66
			b.d[1] = 888
			
			console.log(a,b);
			
			
			function deepCopy(data){
				let type = typeof data
				if(type==='object'&&data!==null){
					if( Array.isArray(data) ){
						let newArr = []
						for (let i = 0; i < data.length; i++) {
							newArr.push(deepCopy(data[i]))
						}
						return newArr
					}else{
						let newObj = {}
						for (let key in data) {
							newObj[key] =  deepCopy(data[key]) 
						}
						return newObj
					}
				}else{
					return data
				}
			}
			
			
			
			
			
			
			
		</script>
	</body>
</html>
<!-- 
   string   boolean  number  null  undefiend   symbol  bigint
   object--- array  duix

一、数组
	- 数组可以把一组相关的数据一起存放，并提供方便的访问(获取）方式。
	- 数组是指**一组数据的集合**，其中的每个数据被称作**元素**，在数组中可以**存放任意类型的元素**。
	数组是一种将一组数据存储在单个变量名下的优雅方式。
	1.创建数组
	//使用数组字面量方式创建带初始值的数组
	var arr = new Array();
	var  数组名 = ['1','2','3','4'];
	数组元素的类型
		数组中可以存放任意类型的数据，例如字符串，数字，布尔值等。
	2.获取数组中的元素
	通过数组每一项的下标来获取
	3.数组的长度
	数组的长度
	数组的长度：默认情况下表示数组中元素的个数
	使用“数组名.length”可以访问数组元素的数量（数组长度）。
	4.数组新增元素
	  数组[ 数组.length ] = 新数据;

二、对象object
	在 JavaScript 中，对象是一组无序的相关属性和方法的集合，所有的事物都是对象，例如字符串、数值、数组、函数等。
	对象是由属性和方法组成的。
	遍历对象的方法
	for (变量 in 对象名字) {
	    // 在此执行代码
	}
	判断对象是否存在某属性 'a' in obj
	增加属性   obj.新属性 =  值 
	删除某个属性  delete obj.name
	改    obj.age = 19
	查   obj.name
	当对象的属性(key)为变量的时候 必须  obj[key]
	  
三、函数
	在 JS 里面，可能会定义非常多的相同代码或者功能相似的代码，这些代码可能需要大量重复使用。虽然 for循环语句也能实现一些简
	单的重复操作，但是比较具有局限性，此时我们就可以使用 JS 中的函数。
	函数：就是**封装了一段可被重复调用执行的代码块**。通过此代码块可以**实现大量代码的重复使用**。 
	1.函数的声明 
	// 声明函数
	function 函数名() {
	    //函数体代码
	}
	let fn = function(){
		
	}
	函数表达式-可以加上()自执行的函数
	匿名函数 引用 ()包起来    匿名函数前面 添加 +  -  !
		2.调用函数
	
	函数名();
	3.函数的封装
	函数的封装是把一个或者多个功能通过函数的方式封装起来，对外只提供一个简单的函数接口
	4.函数的参数（形参，实参，不定参）
	形参 实参个数不一致会怎么样？
	// 形参  函数定义的时候传入的参数
	//实参  函数执行的时候传入的参数
	//不定参 arguments 所有实参的集合
	function fn(){
		console.log(arguments);
		var num = 0 
		for (var i = 0; i < arguments.length; i++) {
			num+=arguments[i]
		}
		console.log(num);
	}
	
	fn(1,2,3,8,8,9,5,5,4,5,5,5,5)
	  不定参---当不确定有多少个参数传递的时候，可以用 arguments 来获取。JavaScript 中，arguments
	  实际上它是当前函数的一个内置对象。所有函数都内置了一个 arguments 对象，arguments 
	  对象中存储了传递的所有实参。arguments展示形式是一个伪数组，因此可以进行遍历。伪数组具有以下特点：
	- 具有 length 属性
	- 按索引方式储存数据
	- 不具有数组的 push , pop 等方法
	  注意：在函数内部使用该对象，用此对象获取函数调用时传的实参。
	5.函数返回值
	返回值：函数调用整体代表的数据；函数执行完成后可以通过return语句将指定数据返回 。
	-  在使用 return 语句时，函数会停止执行，并返回指定的值
	-  如果函数没有 return ，返回的值是 undefined
	
	  #### break ,continue ,return 的区别
	  - break ：结束当前的循环体（如 for、while）
	  - continue ：跳出本次循环，继续执行下次循环（如 for、while）
	  - return ：不仅可以退出函数，还能够返回 return 语句中的值，同时还可以结束当前的函数体内的代码
	6.递归  
	函数里面 自己调用自己  就是  递   当函数里面满足某一个条件 不在调用函数自己的时候 这就是 归
	
	7.this指向  函数挂载的对象  就是说这个函数是谁的属性 那就this指向谁
	
四、基础数据类型与引用数据类型
	
	
	基础   5  string  number boolean  undefined null
	引用   1 对象 -- array 数组  object 对象   function 函数
	
	## 2 - 简单数据类型和复杂数据类型-通过是否相等判断
	### 2.1 简单数据类型
	​	**简单类型**（**基本数据类型**、**值类型**）：在存储时变量中存储的是值本身，包括string ，number，boolean，undefined，null
	### 2.2 复杂数据类型
​		**复杂数据类型（引用类型）**：在存储时变量中存储的仅仅是地址（引用），通过 new 关键字创建的对象（系统对象、自定义对象），如 Object、Array、Date等；
	### 2.3 堆栈
	- 堆栈空间分配区别：
	　　1、栈（操作系统）：由操作系统自动分配释放存放函数的参数值、局部变量的值等。其操作方式类似于数据结构中的栈；
	简单数据类型存放到栈里面
	　　2、堆（操作系统）：存储复杂类型(对象)，一般由程序员分配释放，若程序员不释放，由垃圾回收机制回收。
	PS 深拷贝与浅拷贝
	浅拷贝之拷贝地址  深拷贝完整拷贝
	
	PS 断点调试
	断点调试的流程：
	1、浏览器中按 F12-> sources ->找到需要调试的文件->在程序的某一行设置断点
	2、Watch: 监视，通过watch可以监视变量的值的变化，非常的常用。
	3、摁下F11，程序单步执行，让程序一行一行的执行，这个时候，观察watch中变量的值的变化。
 -->